#ifndef EXECUTIONCONTEXT
#define EXECUTIONCONTEXT

#include <map>
#include <vector>

#include "ExpressionValue.hpp"

class Memory;
class CallingContext;

/**
	@class CallingInstance
	@brief classe de gestion des appels de fonctions et procédures

	cette classe gère la définition d'un appel de fonction ou de procédure (pile des appels, mémoire locale)
*/
class CallingInstance
{
	public:
        /**
            @brief constructeur de la classe

            initialise les attributs à leur valeur par défaut et crée la mémoire locale et alloue la place nécessaire pour les arguments et variables locales.
            @param [in] instanceOf le contexte global associée à la fonction appelée
        */
		CallingInstance ( CallingContext* instanceOf );
		/**
            @brief destructeur de la classe

            détruit la classe ainsi que tout ce qui a été créé dynamiquement
            @todo libération de la mémoire
        */
		~CallingInstance ();
		/**
            @brief accède à l'adresse d'un paramètre ou d'une variable

            renvoie l'adresse en mémoire locale associée à un identificateur
            @param [in] index la position de l'identificateur dans la table des identificateurs
            @return l'adresse de cet identificateur en mémoire locale
            @todo gestion des erreurs si l'identificateur n'est pas associé à cette fonction
            @todo gestion des erreurs si l'identificateur n'a pas été alloué en mémoire
        */
		unsigned int getAddress ( unsigned int index ) const;
		/**
            @brief accès à la mémoire locale

            renvoie la mémoire locale de cette fonction
            @return le pointeur sur l'instance de la classe Memoire contenant la mémoire locale de cet appel de fonction
		*/
		Memory* getMemory () const;
		/**
            @brief exécution de la fonction

            exécute la fonction
            @todo gestion des erreurs si pas de code
		*/
		void execute ();
		/**
		*/
		ExpressionValue getValue () const;
		friend class CallingContext;
	private:
        /// le contexte global associée à la fonction appelée
		CallingContext* _instanceOf;
		/// le contexte locale de la fonction appelante
		CallingInstance* _callerContext;
		/// la mémoire locale associée à cet appel
		Memory* _localMemory;
		/// l'adressage en mémoire locale : mapping index -> adresse
		std::map < unsigned int, unsigned int > _memoryAddressing;
		///
		ExpressionValue _value;
};

#endif
